<?php
namespace app\store\controller;

use think\Db;
use app\common\controller\Api;

/****
 * Class    首页信息
 * @name    店铺API文件
 * @author  晓月老板<1434926265@qq.com>
 * @date    2020/05/20 11:34 AM
 * @package app\api\controller
 */
class Index extends Api
{

    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    // 默认方法
    public function _initialize()
    {
        parent::_initialize();

        // 获取店铺ID
        $this->store_id = $this->request->request("store_id",0,"intval");
    }

    /***
     * @name    店铺列表API接口
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/05/20 11:34 AM
     * @return  string<json>
     */
    public function store_list()
    {

        // 筛选排序 综合=weigh，距离=distance，销量=sales，好评=favourable，配送费最低（外卖起送价）=take_out_price
        $where = array();

        // 排序信息 默认 id降序
        $order = $this->request->get("order", 'id desc', 'trim');

        // 经度
        $longitude = $this->request->get("longitude", '', 'trim');

        // 纬度
        $latitude = $this->request->get("latitude", '', 'trim');

        // 分页（默认从0开始）
        $page = $this->request->get("page", 0, 'intval');

        // 服务id
        $service_value = $this->request->get("service_value", '');

        if(isset($service_value) && $service_value !== ''){

            // 查询店铺数据
            $store_list = Db::name('manystore')
                            ->alias('s')
                            ->join('manystore_value sv','s.id = sv.manystore_id')
                            ->where(array('s.status'=>'normal','s.apply_status'=>'1','sv.config_id'=>'15'))
                            ->where('find_in_set(:service_value,sv.value)',['service_value'=>$service_value])
                            ->where($where)
                            ->field('s.id')
                            ->select();

        }else{

            // 查询店铺数据
            $store_list = Db::name('manystore')
                            ->alias('s')
                            ->join('manystore_value sv','s.id = sv.manystore_id')
                            ->where(array('s.status'=>'normal','s.apply_status'=>'1','sv.config_id'=>'15'))
                            ->where($where)
                            ->field('s.id')
                            ->select();

        }

        if($order == 'distance'){

            // 距离排序
            $data = $this->sort_distance_store_list($store_list,$page,$longitude,$latitude);

        }else{

            // 常规排序
            $data = $this->sort_store_list($store_list,$order,$page);

        }

        $this->success('请求成功', $data);

    }

    // 常规排序
    public function sort_store_list($store_list,$order,$page)
    {

        // 新数组
        $new_store_id_array = array();

        $where = array();

        if(is_array($store_list) && count($store_list) > 0){

            foreach($store_list as $k => $v){

                $new_store_id_array[] = $v['id'];

            }

        }

        // 把数组拼装成字符串
        $new_store_id_string = implode(',',$new_store_id_array);

        if($order == 'weigh'){

            // id 升序
            $order = 's.id asc';

        }

        if($order == 'sales'){

            $where['sv.config_id'] = '19';

            // 销量 升序
            $order = 'sv.value desc';

        }

        if($order == 'favourable'){

            $where['sv.config_id'] = '20';

            // 好评 降序
            $order = 'sv.value desc';

        }

        if($order == 'delivery_fee'){

            $where['sv.config_id'] = '21';

            // 配送费 升序
            $order = 'sv.value asc';

        }

        if($order == 'take_out_price'){

            $where['sv.config_id'] = '17';

            // 起送价 升序
            $order = 'sv.value asc';

        }

        $where['sv.manystore_id'] = array('in', $new_store_id_string);

        $data = Db::name('manystore s')
                    ->join('manystore_value sv','s.id = sv.manystore_id')
                    ->where($where)
                    ->group('sv.manystore_id')
                    ->field('s.*,sv.*')
                    ->order($order)
                    ->limit($page.',6')
                    ->select();
//        echo Db::name('manystore s')->getLastSql();exit;
        if(is_array($data) && count($data) > 0){

            foreach($data as $k => $v){

                $data[$k]['store_info'] = $this->get_store_config_info($v['manystore_id']);

            }

        }

        return $data;

    }

    // 距离排序
    public function sort_distance_store_list($store_list,$page,$longitude,$latitude)
    {

        // 新数组
        $new_store_id_array = array();

        $where = array();

        if(is_array($store_list) && count($store_list) > 0){

            foreach($store_list as $k => $v){

                $new_store_id_array[] = $v['id'];

            }

        }

        // 把数组拼装成字符串
        $new_store_id_string = implode(',',$new_store_id_array);

        $where['sv.manystore_id'] = array('in', $new_store_id_string);

        $data = Db::name('manystore s')
                    ->join('manystore_value sv','s.id = sv.manystore_id')
                    ->where($where)
                    ->group('sv.manystore_id')
                    ->field('s.*,sv.*')
                    ->limit($page.',6')
                    ->select();

        // 拼装店铺信息
        if(is_array($data) && count($data) > 0){

            foreach($data as $k => $v){

                // 店铺信息
                $data[$k]['store_info'] = $this->get_store_config_info($v['manystore_id']);

                // 获取店铺定位
                $store_location = $this->get_store_location($v['manystore_id']);
                $data[$k]['store_location'] = $store_location;

                // 计算用户的距离
                $data[$k]['current_distance'] = $this->get_current_distance($store_location,$longitude,$latitude);

            }

        }

        // 根据 距离排序
        @array_multisort(array_column($data, 'current_distance'), SORT_ASC, $data);

        return $data;

    }


    /***
     * @name    店铺详情API接口
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/05/20 11:34 AM
     * @return  string<json>
     */
    public function info()
    {

        // 查询店铺数据
        $data['store_info'] = Db::name('manystore')->where(array('id'=>$this->store_id,'apply_status'=>'1'))->find();

        $data['config_info'] = $this->get_store_config_info($this->store_id);

        $this->success('请求成功', $data);

    }

    /***
     * @name    获取店铺配置信息
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/05/20 11:34 AM
     * @return  string<json>
     */
    public function get_store_config_info($store_id)
    {

        // 获取配置列表
        $config_list = Db::name('manystore_value')->where(array('manystore_id'=>$store_id))->field('config_id,value')->select();

        // 追加上配置项名称
        if(is_array($config_list) && count($config_list) > 0){
            foreach($config_list as $k => $v){
                $config_list[$k]['config_name'] = Db::name('manystore_config')->where(array('id'=>$v['config_id']))->value('title');
            }
        }

        return $config_list;

    }

    /***
     * @name    获取店铺经纬度
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/05/20 11:34 AM
     * @return  string<json>
     */
    public function get_store_location($store_id)
    {

        // 获取配置列表
        return Db::name('manystore_value')->where(array('manystore_id'=>$store_id,'config_id'=>'11'))->value('value');

    }

    /***
     * @name    获取距离
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/05/20 11:34 AM
     * @return  string<json>
     */
    public function get_current_distance($store_location,$longitude,$latitude)
    {

        // 获取配置列表
        $result = Db::query('SELECT (st_distance(point('.$store_location.'),point ('.$longitude.','.$latitude.'))*111195/1000 )as distance');
//echo $result[0]['distance'];exit;
        return $result[0]['distance'];

    }


    /***
     * @name    设置店铺配置信息
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/06/01 14:48 PM
     * @return  string<json>
     */
    public function edit_store_config_info()
    {

        // 配置id 和 店铺id
        $config_id = $this->request->post("config_id", false, 'intval');
        $manystore_id = $this->request->post("manystore_id", false, 'intval');
        $value = $this->request->post("value", false, 'trim');
        if(!$config_id || !$manystore_id){$this->error(__('Invalid parameters'));}

        // 修改信息
        $result = Db::name('manystore_value')->where(array('config_id'=>$config_id,'manystore_id'=>$manystore_id))->update(array('value'=>$value));

        if($result){
            $this->success('修改成功');
        }else{
            $this->error('修改失败');
        }
    }


    /***
     * @name    设置店铺常规基础信息
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/06/01 15:51 PM
     * @return  string<json>
     */
    public function edit_store_base_info()
    {

        // 配置id 和 店铺id
        $config_id = $this->request->post("config_id", false, 'intval');
        $manystore_id = $this->request->post("manystore_id", false, 'intval');
        $value = $this->request->post("value", false, 'trim');
        if(!$config_id || !$manystore_id || !$value){$this->error(__('Invalid parameters'));}

        // 修改信息
        $result = Db::name('manystore_value')->where(array('config_id'=>$config_id,'manystore_id'=>$manystore_id))->update(array('value'=>$value));

        if($result){
            $this->success('修改成功');
        }else{
            $this->error('修改失败');
        }
    }



    /***
     * @name    店铺公告API接口
     * @author  晓月老板<1434926265@qq.com>
     * @date    2020/05/20 11:34 AM
     * @return  string<json>
     */
    public function notice_list()
    {

        // 查询店铺数据
        $data = Db::name('notice')->where(array('status'=>'normal'))->whereIn('store_id','0,'.$this->store_id)->select();

        $this->success('请求成功', $data);

    }

}
